package modele;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;

import javax.imageio.ImageIO;
/**
 * Contient les méthodes qui manipulent les données,
 * appelées par les controlers.
 * @author Plancq Charlotte, Lanvin Kévin, Darras Raphael
 *
 *
 */
public class Traitement extends Observable{
	/**
	 * la BDtheque dans la quelle toutes les actions se passeront
	 */
	private Bdtheque bdt;

	/**
	 * constructeur de la classe
	 * @param BDtheque
	 */
	public Traitement(Bdtheque bdt){
		this.setBdt(bdt);
	}
/**
 * retourne une liste de tout les genres attribuables a une BD
 * @return ArrayList
 */
	public ArrayList<String> getGenres(){
		ArrayList<String> genres =getBdt().getGenres();
		return genres;
	}
/**
 * Ajoute un album n'appartenant a aucune collection a la BDtheque,
 * retourne faux en cas d'erreur
 * @param String titre
 * @param String auteur
 * @param String editeur
 * @param String genre
 * @param String serie
 * @param String synopsis
 * @param int note
 * @param String commentaire
 * @param String image
 * @return boolean
 */
	public boolean ajouterAlbumBdtheque (String titre,String auteur, String editeur, String genre, String serie,  String synopsis, int note, String commentaire,String image){
		Album nouveau = new Album(titre, auteur, editeur, genre, serie, synopsis,note,commentaire,image);
		return this.getBdt().addAlbum(nouveau,0);
	}

	/**
	 * Ajoute une album dans une collection
	 * @param album
	 * @param collection
	 */
	public void ajouterAlbumCollection(int album, int collection){
		Album alb = this.getBdt().getAlbum(album);
		getBdt().addAlbum(alb, collection);
	}
/**
 * AJoute un commentaire a l'album en parametre
 * retourne faux en cas d'erreur
 * @param Album a
 * @param String commentaire
 * @return boolean
 */
	public boolean ajouterCommentaire(Album a,String comment){
		a.setCommentaire(comment);
		return true;
	}

	/**
	 * Attribue une note a l'album
	 * @param Album a
	 * @param int note
	 * @return boolean
	 */
	public boolean setNote (Album a,int note){
		a.setNote(note);
		return true;
	}
/**
 * Attribue un genre a l'album
 * @param Album a
 * @param String genre
 * @return boolean
 */
	public boolean setGenre(Album a, String genre){
		a.setGenre(genre);
		return false;
	}

	/**
	 * Cree une collection dont le nom est passe en parametre
	 * @param String n
	 */
	public void creerCollection(String n){
		this.getBdt().addCollection(new CollectionAlbums(getBdt(),n));
		setChanged();
		notifyObservers();
	}
/**
 * Retourne une liste d'album contenant la chaine de caractere
 * entree en parametre dans leurs attributs
 * @param String
 * @return ListModelAlbums
 */
	public ListModelAlbums<Album> rechercheAll(String s){
		System.out.println("Creation de l'album avec la string \""+s+"\"");
		Album a=new Album(s,null,null,null,null,null,0,null,null);
		ArrayList<Album> liste = (ArrayList<Album>) this.getBdt().rechercherAlbum(a);
		return new ListModelAlbums<Album>(liste);
	}

	/**
	 * retourne une lise d'albums dont les attribut correspondent
	 * aux chaines de caracteres passées en parametre
	 * @param titre
	 * @param auteur
	 * @param editeur
	 * @param genre
	 * @param serie
	 * @param synopsis
	 * @return ListeModelAlbums
	 */
	public ListModelAlbums<Album> rechercheAvancee(String titre,String auteur, String editeur, String genre, String serie,  String synopsis){
		Album a=new Album(titre,auteur,editeur,genre,serie,synopsis, 0,null,null);
		return new ListModelAlbums<Album>((List<Album>) this.getBdt().rechercherAlbum(a));
	}
	
/**
 * supprime la i-eme collection de la BDtheque
 * @param int i
 */
	public void supprimerCollection(int i){
		this.getBdt().getCollections().remove(this.getBdt().getElementAt(i));
		setChanged();notifyObservers();
	}
/**
 * Supprime l'album a dans la collection c
 * @param Album a
 * @param Collection c
 */
	public void supprimerAlbumDansCollection(int a, int c){
		this.getBdt().getElementAt(c).remove(this.getBdt().getElementAt(c).getElementAt(a));
		setChanged();notifyObservers();
	}

	/**
	 * Ferme le programme
	 */
	public void quitter(){
		System.exit(0);
	}
/**
 * Attribut en tant que nouvel attribue a L'album a,
 * les chaines de caracteres passee en parametre, si elles ne sont pas nulles 
 * retourne faux en cas d'erreur
 * @param a
 * @param titre
 * @param auteur
 * @param editeur
 * @param genre
 * @param serie
 * @param synopsis
 * @param note
 * @param commentaire
 * @return boolean
 */
	public boolean modifierAlbum(Album a,String titre,String auteur, String editeur, String genre, String serie,String synopsis, int note, String commentaire){
		if(titre!=null){
			a.titre=titre;
		}
		if(auteur!=null){
			a.auteur=auteur;
		}
		if(editeur!=null){
			a.editeur=editeur;
		}
		if(genre!=null){
			a.genre=genre;
		}
		if(serie!=null){
			a.serie=serie;
		}
		a.note=note;
		if(synopsis!=null){
			a.synopsis=synopsis;
		}
		if(commentaire!=null)
			a.commentaire=commentaire;
		return true;
	}
/**
 * Retourne une collection de tout les albums contenus dans la BDtheque
 * @return CollectionAlbums
 */
	public CollectionAlbums getAlbums(){
		return getBdt().getElementAt(0);
	}
	/**
	 * Retourne toutes les collections de la BDTheque
	 * @return Bdtheque
	 */
	public Bdtheque getCollections(){
		return this.getBdt();
	}

	/**
	 * Retourne une liste de toutes les collections de la BDtheque
	 * @return ArrayList
	 */
	public ArrayList<CollectionAlbums>getListCollections(){
		return this.getBdt().getCollections();
	}
/**
 * Enregistre les donnees manipulees dans un fichier 
 * @param File
 */
	public void enregistrer (File fichier){
		LectureEcriture.enregistrer(this.getBdt(),fichier);
	}

	/**
	 * Importe les donnees du fichier precise
	 * @param File
	 * @throws IOException
	 */
	public void importer(File fichier) throws IOException {
		// TODO Auto-generated method stub
		LectureEcriture.importBdtheque(this.getBdt(), fichier);
		setChanged();notifyObservers();
	}
/**
 * Attribue un nom a la i-eme collection
 * Retourne faux en cas d'erreurs
 * @param int
 * @param String
 * @return boolean
 */
	public boolean setNomCollection(int i, String s) {
		boolean b = this.getListCollections().get(i).setNom(s);
		notifyObservers();
		return b;
	}
/**
 * Sauvegarde une image dans le fichier correspondant aux images,
 * Une image est representee par son nom et le chemin qui lui correspond
 * @param image_name
 * @param img
 */
	public void save(String image_name, String img) {

		try {
			File f=new File(img);
			BufferedImage bi;
			try{
				bi = ImageIO.read(f);
			}catch(Exception e){
				bi= ImageIO.read(new File("img\\question.png"));
			}
			f=new File("img\\"+image_name);
			f.createNewFile();
			String file_format = image_name.substring(image_name.lastIndexOf('.')+1);

			@SuppressWarnings("unused")
			boolean success = ImageIO.write(bi, file_format, f);
		} catch (Exception e) {

		}//end try
	}//end save
/**
 * Retourne la BDtheque actuelle
 * @return Bdtheque
 */
	public Bdtheque getBdt() {
		return this.bdt;
	}
/**
 * Attribue une BDtheque au systeme
 * @param bdt
 */
	public void setBdt(Bdtheque bdt) {
		this.bdt = bdt;
	}

}
